package chapter01.part7;

import java.util.Optional;
import java.util.concurrent.ThreadLocalRandom;

/**
 * 使用 flatmap 把 Optional<T> 转换成 T
 * 
 * @author insight 
 * @since 2021/7/19
 */
public class FlatMap {
    public static void main(String[] args) {
        /*
         * 假设 s 有方法 Optional<T> f()
         * T 有方法 Optional<U> g()
         * 想要理想调用 s.f().g() 来直接得到结果
         * 但不行 明显类型不同
         * faltmap() 就是解决这个的
         */
        double x = ThreadLocalRandom.current().nextDouble();
        System.out.println(Optional.of(x).flatMap(FlatMap::inverse).flatMap(FlatMap::sqt));
    }

    public static Optional<Double> inverse(Double x) {
        return x == 0 ? Optional.empty() : Optional.of(1 / x);
    }

    public static Optional<Double> sqt(Double x) {
        return x < 0 ? Optional.empty() : Optional.of(Math.sqrt(x));
    }
}